<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>ECMAScript 逻辑运算符</title>
    <script>

        /*
        == 会默认进行类型转换 
        执行类型转换的规则如下：

        如果一个运算数是 Boolean 值，在检查相等性之前，把它转换成数字值。false 转换成 0，true 为 1。
        如果一个运算数是字符串，另一个是数字，在检查相等性之前，要尝试把字符串转换成数字。
        如果一个运算数是对象，另一个是字符串，在检查相等性之前，要尝试把对象转换成字符串。
        如果一个运算数是对象，另一个是数字，在检查相等性之前，要尝试把对象转换成数字。

        值 null 和 undefined 相等。
        在检查相等性时，不能把 null 和 undefined 转换成其他值。
        如果某个运算数是 NaN，等号将返回 false，非等号将返回 true。
        如果两个运算数都是对象，那么比较的是它们的引用值。如果两个运算数指向同一对象，那么等号返回 true，否则两个运算数不等。
        重要提示：即使两个数都是 NaN，等号仍然返回 false，因为根据规则，NaN 不等于 NaN。

        */
        function testEqual(){

            /*
            null == undefined	true
            "NaN" == NaN	false
            5 == NaN	false
            NaN == NaN	false
            NaN != NaN	true
            false == 0	true
            true == 1	true
            true == 2	false
            undefined == 0	false
            null == 0	false
            "5" == 5	true

            */
        }

        /*
        全等号和非全等号
        等号和非等号的同类运算符是全等号和非全等号。这两个运算符所做的与等号和非等号相同，只是它们在检查相等性前，不执行类型转换。

        全等号由三个等号表示（===），只有在无需类型转换运算数就相等的情况下，才返回 true。
        */
        function testFullEqual(){
            var sNum = "66";
            var iNum = 66;
            alert(sNum == iNum);	//输出 "true"
            alert(sNum === iNum);	//输出 "false"
        }

        function testNotFullEqual(){

//             非全等号由感叹号加两个等号（!==）表示，只有在无需类型转换运算数不相等的情况下，才返回 true。

// 例如：

            var sNum = "66";
            var iNum = 66;
            alert(sNum != iNum);	//输出 "false"
            alert(sNum !== iNum);	//输出 "true"
        }

    </script>
</head>
<body>
    <button onclick="testToBoolean()">测试ToBoolean</button>
</body>
</html>